package org.csu.jpetstore.bo;

import lombok.Data;
import org.csu.jpetstore.entity.Inventory;
import org.csu.jpetstore.entity.Item;
import org.csu.jpetstore.entity.ShoppingCart;
import org.csu.jpetstore.util.MySpringBeanCreateUtil;
import org.csu.jpetstore.vo.CartItemVO;

import java.math.BigDecimal;

/**
 * @author huangzhangyan
 */
@Data
public class CartItemBO {
    private ItemBO itemBO;
    private Integer quantity;
    private Boolean inStock;

    private CartItemBO(ShoppingCart shoppingCart, Item item, Inventory inventory) {
        this(shoppingCart, ItemBO.toItemBO(null, item, inventory));
    }

    private CartItemBO(ShoppingCart shoppingCart, ItemBO itemBO) {
        this.itemBO = itemBO;
        this.quantity = shoppingCart.getQuantity();
        this.inStock = (itemBO.getQuantity() > 0);
    }

    private CartItemBO(CartItemVO cartItemVO) {
        this.itemBO = MySpringBeanCreateUtil.getItemService().getItemBOById(cartItemVO.getItemId());
        this.quantity = cartItemVO.getQuantity();
        this.inStock = cartItemVO.getInStock();
    }

    private CartItemBO(ItemBO itemBO, Integer quantity) {
        this.itemBO = itemBO;
        this.quantity = quantity;
        this.inStock = (itemBO.getQuantity() > 0);
    }


    /**
     * 弃用的
     */
    @Deprecated
    private CartItemBO(ShoppingCart shoppingCart) {
        this.itemBO = MySpringBeanCreateUtil.getItemService().getItemBOById(shoppingCart.getItemId());
        this.quantity = shoppingCart.getQuantity();
        this.inStock = (itemBO.getQuantity() > 0);
    }

    public static CartItemBO toCartItemBO(ShoppingCart shoppingCart, ItemBO itemBO) {
        if (shoppingCart == null || itemBO == null)
            return null;
        return new CartItemBO(shoppingCart, itemBO);
    }

    public static CartItemBO toCartItemBO(ItemBO itemBO, Integer quantity) {
        if (itemBO == null || quantity == null) {
            return null;
        }
        return new CartItemBO(itemBO, quantity);
    }

    public static ShoppingCart toShoppingCartEntity(CartItemBO cartItemBO, String username) {
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setUsername(username);
        shoppingCart.setItemId(cartItemBO.getItemBO().getItemId());
        shoppingCart.setQuantity(cartItemBO.getQuantity());
        shoppingCart.setInStock(cartItemBO.getInStock());

        shoppingCart.setTotal(cartItemBO.getItemBO().getListPrice()
                .multiply(BigDecimal.valueOf(cartItemBO.getQuantity())));
        return shoppingCart;
    }
}
